package com.kaikeba.wx.controller;

import com.kaikeba.bean.Courier;
import com.kaikeba.bean.Express;
import com.kaikeba.bean.Message;
import com.kaikeba.bean.User;
import com.kaikeba.mvc.ResponseBody;
import com.kaikeba.service.CourierService;
import com.kaikeba.service.ExpressService;
import com.kaikeba.service.UserService;
import com.kaikeba.util.JSONUtil;
import com.kaikeba.util.RandomUtil;
import com.kaikeba.util.UserUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;

/**
 * @description:
 * @author: ManolinCoder
 * @time: 2021/9/5
 */
public class UserController {

    @ResponseBody("/wx/loginSms.do")
    public String sendSms(HttpServletRequest request, HttpServletResponse response){
        //首先模拟短信发送，发送验证码到控制台
        String userPhone = request.getParameter("userPhone");
        String code = RandomUtil.getCode()+"";
        System.out.println("验证码为:"+code);
        Message msg = new Message();
        msg.setResult("验证码已发送!");
        UserUtil.setLoginSms(request.getSession(),userPhone,code);
        String json = JSONUtil.toJSON(msg);
        return json;
    }
    @ResponseBody("/wx/login.do")
    public String login(HttpServletRequest request, HttpServletResponse response){
        String userPhone = request.getParameter("userPhone");
        String userCode = request.getParameter("code");
        String sysCode = UserUtil.getLoginSms(request.getSession(), userPhone);
        Message msg = new Message();
        if (sysCode == null){
            //当前手机号未接收到验证码
            msg.setStatus(-1);
            msg.setResult("该手机号未获取到短信!");
        }else if (sysCode.equals(userCode)){
            //用户输入的验证码和发送的一致,登录成功
            User user = new User();
            user.setuPhoneNumber(userPhone);
            //判断登录者是快递员还是用户
            Courier cORu = CourierService.findByPhoneNumber(userPhone);
            Date now = new Date();//获取当前时间
            if (cORu != null){
                //快递员
                //快递员登录后更新最后登录时间
                cORu.setcLastLoginTime(now);
                //注意设置手机号为null以符合更新逻辑
                cORu.setcPhoneNumber(null);
                boolean update = CourierService.update(cORu.getId(), cORu);

                msg.setStatus(1);
                user.setUser(false);
                //存入用户姓名（无论是快递员还是普通用户，便于后面显示）
                user.setUname(cORu.getCname());
            }else {
                //用户
                User userInDataBaseOrNot = UserService.findUserIncludeStatusIsOneByPhoneNum(userPhone);
                msg.setStatus(0);
                user.setUser(true);
                //如果用户不存在（手机号不存在）则插入新用户
                if (userInDataBaseOrNot == null){
                    //新用户只有手机号字段值和自动生成的字段值
                    UserService.insert(user);
                }else if (userInDataBaseOrNot.getuStatus() == 1){
                    //如果是假删除的用户则无法登录
                    msg.setStatus(-3);
                    msg.setResult("当前用户已注销!");
                }else {
                    //普通用户正常登录，更新最后登录的时间
                    userInDataBaseOrNot.setuLastLoginTime(now);
                    //注意设置手机号为null以符合更新逻辑
                    userInDataBaseOrNot.setuPhoneNumber(null);
                    UserService.update(userInDataBaseOrNot.getId(),userInDataBaseOrNot);
                    //存入用户姓名（无论是快递员还是普通用户，便于后面显示）
                    user.setUname(userInDataBaseOrNot.getUname());
                }
            }
            UserUtil.setWxUser(request.getSession(),user);
        }else {
            //用户输入的验证码和发送的不一致,登录失败
            msg.setStatus(-2);
            msg.setResult("验证码错误!");
        }
        String json = JSONUtil.toJSON(msg);
        return json;
    }

    @ResponseBody("/wx/userInfo.do")
    public String userInfo(HttpServletRequest request, HttpServletResponse response){
        User user = UserUtil.getWxUser(request.getSession());
        boolean isUser = user.isUser();
        Message msg = new Message();
        if (isUser){
            msg.setStatus(0);
        }else {
            msg.setStatus(1);
        }
        msg.setResult(user.getuPhoneNumber());
        if (user.getUname() == null){
            msg.setData("请设置姓名");
        }else {
            msg.setData(user.getUname());
        }
        return JSONUtil.toJSON(msg);
    }

    @ResponseBody("/wx/logout.do")
    public String logout(HttpServletRequest request, HttpServletResponse response){
        //1.销毁session
        request.getSession().invalidate();
        //2.给客户端回复消息
        Message msg = new Message(0);
        return JSONUtil.toJSON(msg);
    }

    @ResponseBody("/wx/updateNameAndPhone.do")
    public String updateUserOrEcourierNameAndPhone(HttpServletRequest request, HttpServletResponse response){
        User user = UserUtil.getWxUser(request.getSession());
        //页面传入的新数据
        String name = request.getParameter("name");
        String phone = request.getParameter("phone");
        String code = request.getParameter("code");
        String sysCode = UserUtil.getLoginSms(request.getSession(), phone);
        Message msg = new Message();
        //验证码匹配
        if (sysCode == null){
            //当前手机号未接收到验证码
            msg.setStatus(-1);
            msg.setResult("该手机号未获取到短信!");
        }else if (sysCode.equals(code)){
            //先通过session里的user的手机号查询信息，因为session里的用户信息不全
            //判断是快递员还是用户分别调用不同的方法
            if (user.isUser()){
                //是用户
                User user1 = UserService.findUserIncludeStatusIsOneByPhoneNum(user.getuPhoneNumber());
                boolean flag = false;
                //更新信息
                if (user.getuPhoneNumber().equals(phone)){//新旧号码一致，即不修改号码
                    user1.setUname(name);
                    //注意设置手机号为null以符合更新逻辑
                    user1.setuPhoneNumber(null);
                    flag = UserService.update(user1.getId(),user1);
                }else {//新旧号码不一致，即修改号码
                    user1.setUname(name);
                    user1.setuPhoneNumber(phone);
                    flag = UserService.update(user1.getId(),user1);
                }
                if (flag){
                    //修改快递表中相应用户的姓名和手机号，注意用老号码查询并且修改所有对应的快递（无论取件或未取件）
                    List<Express> oldExpressList = ExpressService.findByUserPhone(user.getuPhoneNumber());
                    if (oldExpressList.size() != 0){
                        for (Express express : oldExpressList) {//逐个快递修改信息
                            express.setUsername(name);
                            express.setUserPhone(phone);
                            flag = ExpressService.update(express);
                            if (!flag){
                                break;
                            }
                        }
                    }
                    //然后注意更新session里的user数据，上下两步顺序不能颠倒!
                    user.setUname(name);
                    user.setuPhoneNumber(phone);
                    UserUtil.setWxUser(request.getSession(),user);
                    if (flag){
                        msg.setStatus(1);
                        msg.setResult("修改成功!");
                    }else {
                        msg.setStatus(-3);
                        msg.setResult("修改失败!");
                    }
                }else {
                    msg.setStatus(-3);
                    msg.setResult("手机号已存在!");
                }
            }else {
                //是快递员
                Courier courier = CourierService.findByPhoneNumber(user.getuPhoneNumber());
                boolean flag = false;
                //更新信息
                if (user.getuPhoneNumber().equals(phone)){//新旧号码一致，即不修改号码
                    courier.setCname(name);
                    //注意设置手机号为null以符合更新逻辑
                    courier.setcPhoneNumber(null);
                    flag = CourierService.update(courier.getId(), courier);
                }else {//新旧号码不一致，即修改号码
                    courier.setCname(name);
                    courier.setcPhoneNumber(phone);
                    flag = CourierService.update(courier.getId(), courier);
                }
                if (flag){
                    //修改快递表中相应用户的姓名和手机号，注意用老号码查询并且修改所有对应的快递（无论取件或未取件）
                    List<Express> oldExpressList = ExpressService.findByUserPhone(user.getuPhoneNumber());
                    if (oldExpressList.size() != 0){
                        for (Express express : oldExpressList) {//逐个快递修改信息
                            express.setUsername(name);
                            express.setUserPhone(phone);
                            flag = ExpressService.update(express);
                            if (!flag){
                                break;
                            }
                        }
                    }
                    //注意更新session里的user数据，上下两步顺序不能颠倒!
                    user.setUname(name);
                    user.setuPhoneNumber(phone);
                    UserUtil.setWxUser(request.getSession(),user);
                    if (flag){
                        msg.setStatus(1);
                        msg.setResult("修改成功!");
                    }else {
                        msg.setStatus(-3);
                        msg.setResult("修改失败!");
                    }
                }else {
                    msg.setStatus(-3);
                    msg.setResult("手机号已存在!");
                }
            }
        }else {
            //用户输入的验证码和发送的不一致,登录失败
            msg.setStatus(-2);
            msg.setResult("验证码错误!");
        }
        String json = JSONUtil.toJSON(msg);
        return json;
    }
}
